//genertaor
//        next()函数的用法
//        yield*的语法
{
  // genertaor基本定义 ：异步编程的一种解决方案
  let tell=function* (){          //1
    yield 'a';                    //2
    yield 'b';
    return 'c'
  };

  let k=tell();

  console.log(k.next());
  console.log(k.next());
  console.log(k.next());
  console.log(k.next());
}

{  //iterator接口 除了自定义  也可以使用genertaor定义
  let obj={};
  obj[Symbol.iterator]=function* (){
    yield 1;
    yield 2;
    yield 3;
  }

  for(let value of obj){
    console.log('value',value);
  }
}

{//状态机  三种状态 顺序切换 循环
  let state=function* (){
    while(1){
      yield 'A';
      yield 'B';
      yield 'C';
    }
  }
  let status=state();
  console.log(status.next());
  console.log(status.next());
  console.log(status.next());
  console.log(status.next());
  console.log(status.next());
}

// {
//   let state=async function (){
//     while(1){
//       await 'A';
//       await 'B';
//       await 'C';
//     }
//   }
//   let status=state();
//   console.log(status.next());
//   console.log(status.next());
//   console.log(status.next());
//   console.log(status.next());
//   console.log(status.next());
// }

//-----------------
//举例子 ：  抽奖
//-----------------
{
    let draw=function(count){
        //具体抽奖逻辑
        console.info(`剩余${count}次`)//以前是使用全局变量--危险的并影响性能的
    }

    let residue=function* (count){   //---通过gererator控制抽奖逻辑
        while (count>0) {
            count--;
            yield draw(count);
        }
    }

    let star=residue(5);                            //初始，可5次~！
    let btn=document.createElement('button');
    btn.id='start';
    btn.textContent='抽奖';
    document.body.appendChild(btn);
    document.getElementById('start').addEventListener('click',function(){
        star.next();
    },false)
}

//-----------------
//举例子 ：  定时取得服务器的状态
//-----------------
{
    // 长轮询           //以前是使用定时器
    let ajax=function* (){
        yield new Promise(function(resolve,reject){    //Promise  和 gernerator  相结合
            setTimeout(function () {
                resolve({code:0})                       //返回的数据是{code:0}
            }, 200);
        })
    }

    let pull=function(){                       //轮询
        let genertaor=ajax();
        let step=genertaor.next();             //定义 gernerator的操作
        step.value.then(function(d){
            if(d.code!=0){
                setTimeout(function () {
                    console.info('wait');
                    pull()
                }, 1000);
            }else{
                console.info(d);
            }
        })
    }

    pull();
}
